import java.io.File;
import java.io.IOException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;


public class Main {

	public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
		System.out.println("Partie 1 - Mise à jour de Competences.xml");
		DocumentBuilder db = dbf.newDocumentBuilder ();
		Document competences = db.parse(new File("../Competences.xml"));
		majCompetencesXml(db, competences);
		ecrireXml(competences, "../Competences.xml");
		
		System.out.println("Partie 2 - Création de Personnes.xml");
		Document doc = db.newDocument();
		Element personnes = doc.createElement("Personnes");
		doc.appendChild(personnes);
		generationPersonnesXml(db, doc, personnes, competences.getDocumentElement());
		ecrireXml(doc, "../Personnes.xml");
	}
	
	public static void majCompetencesXml(DocumentBuilder db, Document competences) throws ParserConfigurationException, SAXException, IOException {
		for(String cv : new File("../CV/").list()) {
			if (cv.matches(".*\\.xml$")) {
				// Parse du CV
				Document CV = db.parse(new File("../CV/" + cv));
				
				//Lecture des Compétence
				NodeList CompCV = CV.getElementsByTagName("Comp");
				
				// Pour chaque Compétence du CV
				for (int i = 0; i < CompCV.getLength(); i++) {
					// On prend le Nom
					String nom = CompCV.item(i).getTextContent();
					// Et le domaine
					String domaine = CompCV.item(i).getAttributes().item(0).getTextContent();
					
					// Toutes les Compétences du fichier des Compétences
					NodeList CompList = competences.getElementsByTagName("Competence");
					// Nombre de Compétence pour calculer l'id
					int nbComp = CompList.getLength();
					// On cherche la compétence
					Boolean present = false;
					for (int j = 0; j < CompList.getLength(); j++) {
						String nomComp = "";
						String typeComp = "";
						for (int k = 0; k < CompList.item(j).getChildNodes().getLength(); k++) {
							if (CompList.item(j).getChildNodes().item(k).getNodeName() == "Nom") {
								nomComp = CompList.item(j).getChildNodes().item(k).getTextContent().toLowerCase().trim();
							} else if (CompList.item(j).getChildNodes().item(k).getNodeName() == "Type") {
								typeComp = CompList.item(j).getChildNodes().item(k).getTextContent().toLowerCase().trim();
							}
						}
						if (nom.toLowerCase().trim().equals(nomComp) && domaine.toLowerCase().trim().equals(typeComp)) {
							present = true;
							break;
						}
					}
					// Si on l'a pas trouvé on l'ajoute
					if (!present) {
						// Nouvelle Compétence
						Element n_comp = competences.createElement("Competence");
						
						int nbC = nbComp + 1;
						n_comp.setAttribute("idC", "" + nbC);
						// Création du Nom
						Element n_nom = competences.createElement("Nom");
						
						n_nom.setTextContent(nom);
						// Ajout du nom
						n_comp.appendChild(n_nom);
						
						// Création du Nom
						Element n_type = competences.createElement("Type");
						
						n_type.setTextContent(domaine);
						// Ajout du nom
						n_comp.appendChild(n_type);
						
						Node derComp = competences.getDocumentElement();
						derComp.insertBefore(n_comp, derComp.getLastChild());
					}
				}
			}				
		}
	}
	
	public static void generationPersonnesXml(DocumentBuilder db, Document personnes, Element persRoot, Element comp) {			
			for(String cv : new File("../CV/").list()) {
				if (cv.matches(".*\\.xml$")) {
					try {
						// Lecture du CV.xml
						Document doc = db.parse(new File("../CV/" + cv));
						Element root = doc.getDocumentElement();
						
						// Création d'un CV dans Personne
						Element nvCv = personnes.createElement("CV");
						nvCv.setAttribute("idC", root.getAttribute("idP"));
						
						// Création des balises nom/prénom/nomfic
						Element nom = personnes.createElement("Nom");
						nom.setTextContent(root.getElementsByTagName("Nom").item(0).getTextContent().trim().toUpperCase());
						nvCv.appendChild(nom);
						Element prenom = personnes.createElement("Prenom");
						prenom.setTextContent(root.getElementsByTagName("Prenom").item(0).getTextContent().trim());
						nvCv.appendChild(prenom);
						Element nomFic = personnes.createElement("NomFic");
						nomFic.setTextContent("CV/" + cv);
						nvCv.appendChild(nomFic);
						Element comps = personnes.createElement("Competences");
						
						// Parcours des compétences
						NodeList competances = root.getElementsByTagName("Comp");
						for (int i = 0; i < competances.getLength(); i++) {
							Node node = competances.item(i);
							Element elt = personnes.createElement("Comp");
							
							// Recherche de l'ID dans Competences.xml
							elt.setAttribute("idC", idCompetence(comp, node.getTextContent(), node.getAttributes().getNamedItem("type").getTextContent()));
							
							comps.appendChild(elt);
						}
						
						nvCv.appendChild(comps);
						
						// Ajout du CV à Personne
						persRoot.appendChild(nvCv);
					} catch (SAXException e) {
						e.printStackTrace();
					} catch (IOException e) {
						e.printStackTrace();
					}
				}
			}
	}
	
	public static String idCompetence(Element comp, String nom, String domaine) {
		NodeList competences = comp.getElementsByTagName("Competence");
		for (int i = 0; i < competences.getLength(); i++) {
			Node competence = competences.item(i);
			Node nNom = null;
			Node nType = null;
			for (int j = 0; j < competence.getChildNodes().getLength(); j++) {
				if (competence.getChildNodes().item(j).getNodeName() == "Nom")
					nNom = competence.getChildNodes().item(j);
				else if (competence.getChildNodes().item(j).getNodeName() == "Type")
					nType = competence.getChildNodes().item(j);
			}
			if (nNom.getTextContent().equals(nom) && nType.getTextContent().equals(domaine))
				return competence.getAttributes().getNamedItem("idC").getTextContent();
		}
		return "0";
		
	}
	
	public static void ecrireXml(Document document, String fichier) {
		try {
			Source source = new DOMSource(document);
			StreamResult resultat = new StreamResult(fichier);
			TransformerFactory fabrique = TransformerFactory.newInstance();
			Transformer transformer = fabrique.newTransformer();
			transformer.setOutputProperty(OutputKeys.INDENT, "yes");
			transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
			transformer.transform(source, resultat);
		}
		
		catch(Exception e){
			e.printStackTrace();
		}
	}
}
